/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.tesoreria.be.CierreCaja;
import org.cip.esymons.tesoreria.be.EnumEstadoCierreCaja;

/**
 *
 * @author Gilmar Montoya
 */
@Stateless
public class CierreCajaFacade implements CierreCajaFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(CierreCaja cierreCaja) {
        em.persist(cierreCaja);
    }

    public void edit(CierreCaja cierreCaja) {
        em.merge(cierreCaja);
    }

    public void remove(CierreCaja cierreCaja) {
        em.remove(em.merge(cierreCaja));
    }

    public CierreCaja find(Object id) {
        return em.find(CierreCaja.class, id);
    }

    public List<CierreCaja> findAll() {
        return em.createQuery("select object(o) from CierreCaja as o").getResultList();
    }

    public boolean existeCierreCaja(Date fecha) {
        try {
            List<CierreCaja> lista = em.createQuery("select object(o) from CierreCaja as o Where o.estado<>?1 and o.cieFecha=?2").setParameter(1, EnumEstadoCierreCaja.Anulado).setParameter(2, fecha).getResultList();
            if (lista.size() > 0) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            ControladorAbstracto.warn("Sucedio un error al verificar existencia de caja.");
            return true;
        }

    }

    public CierreCaja cierreCajaACtual() {
        try {
            List<CierreCaja> lista = em.createQuery("select object(o) from CierreCaja as o Where o.estado=?1").setParameter(1, EnumEstadoCierreCaja.Abierto).getResultList();
            if (lista.size() == 0) {
                return null;
            } else {
                if (lista.size() == 1) {
                    return lista.get(0);
                } else {
                    ControladorAbstracto.warn("Existe mas de una caja abierta");
                    return null;
                }
            }
        } catch (Exception e) {
            return null;
        }

    }

    public Integer obtenerNumeracion(Date fecha) {
        try {
            List<CierreCaja> lista = new ArrayList<CierreCaja>();
            Calendar calIni = Calendar.getInstance();
            calIni.setTime(fecha);
            calIni.set(Calendar.DAY_OF_MONTH, 1);
            Calendar calFin = Calendar.getInstance();
            calFin.setTime(fecha);
            calFin.set(Calendar.DAY_OF_MONTH, calFin.getActualMaximum(Calendar.DAY_OF_MONTH));
            lista = em.createQuery("select object(o) from CierreCaja as o Where o.estado<>?1 and o.cieFecha between ?2 and ?3 order by o.cieNumeracion desc").setParameter(1, EnumEstadoCierreCaja.Anulado).setParameter(2, calIni.getTime(),TemporalType.DATE).setParameter(3, calFin.getTime(),TemporalType.DATE).getResultList();
            if (lista.size() == 0) {
                return 1;
            } else {
               CierreCaja cc = (CierreCaja)lista.get(0);
               return cc.getCieNumeracion()+1;
            }
        } catch (Exception e) {
            return 1;
        }

    }
}
